PostgreSQL pg_bulkload 导出 BINARY 格式数据
1 背景知识
本章介绍如何使用 pg_bulkload 将CSV
数据导出为 BANIRY
的格式数据。并将导出的数据进行导入。
2 BINARY 数据单进程导出
2.1 上传CSV 文件
此 isbn.csv
文件为 Zlibrary 的数据库转换后的 CSV
文件。请上传到 /soft
目录。
ls -l /soft/isbn.csv
//屏幕输出:
-rw-r--r-- 1 postgres postgres 253894432 May 2 18:57 /soft/isbn.csv
2.2 创建控制文件
vi /soft/output_baniry_csv.ctl
#
# sample_bin.ctl -- Control file to load fixed binary input data
#
# Copyright (c) 2007-2024, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
WRITER = BINARY # [<schema_name>.]table_name
INFILE = /soft/isbn.csv
OUTPUT = /soft/isbn.data
OUT_COL = INTEGER(8) # binary integer column (int in C)
OUT_COL = VARCHAR(13) # character (10 bytes),
参数说明
对于以上参数详细信息,请参考 pg_bulkload 控制文件参数。
参数 | 值 | 说明 |
---|---|---|
OUTPUT | /soft/isbn.data |
指定导出 BINARY 数据的位置。这里为服务器上文件路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.4 OUTPUT TABLE。 |
INFILE | /soft/isbn.csv |
指定要导入的CSV 数据文件,这里使用了绝对路径,请参考PostgreSQL pg_bulkload 控制文件参数#2.2 INPUT INFILE。 |
WRITER | BINARY |
导出 BINARY 数据。请参考PostgreSQL pg_bulkload 控制文件参数#2.3 WRITER LOADER。 |
OUT_COL | INTEGER(8) |
指定第一列的数据类型,请参考PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数 。 |
OUT_COL | VARCHAR(13) |
指定第二列的数据类型,请参考PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数 。 |
2.3 导出二进制数据
- 清理服务器环境,删除多余的文件。
rm -rf /soft/isbn.data /soft/isbn.data.ctl /soft/isbn.data.log
- 调用 pg_bulkload 将CSV 数据导出为 BANIRAY 格式。
time pg_bulkload -U postgres -d testdb /soft/output_baniry_csv.ctl
- 导出所耗费时间为
4.569s
。
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
12180911 Rows successfully loaded.
0 Rows not loaded due to parse errors.
0 Rows not loaded due to duplicate errors.
0 Rows replaced with new rows.
real 0m4.569s
user 0m0.003s
sys 0m0.006s
Note
执行命令后会自动生成2个文件:
isbn.data.ctl
用于导入 BINARY 格式数据 控制文件。isbn.data
用于导入 BINARY 格式数据 的数据文件。
ls -ltra isbn.*
-rw-r--r-- 1 postgres postgres 253894432 Mar 6 15:12 isbn.csv
-rw------- 1 postgres postgres 393 May 7 16:30 isbn.data.ctl
-rw------- 1 postgres postgres 255799131 May 7 16:30 isbn.data
3 BINARY 数据并发导出
3.1 上传CSV 文件
此 isbn.csv
文件为 Zlibrary 的数据库转换后的 csv
文件。请上传到 /soft
文件夹。
ls -l /soft/isbn.csv
//屏幕输出:
-rw-r--r-- 1 postgres postgres 253894432 May 2 18:57 /soft/isbn.csv
3.2 创建控制文件
vi /soft/output_baniry_csv.ctl
#
# sample_bin.ctl -- Control file to load fixed binary input data
#
# Copyright (c) 2007-2024, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
#
WRITER = BINARY
MULTI_PROCESS = YES
INFILE = /soft/isbn.csv
OUTPUT = /soft/isbn.data
OUT_COL = INTEGER(8) # binary integer column (int in C)
OUT_COL = VARCHAR(13) # character (10 bytes),
参数说明
对于以上参数详细信息,请参考 pg_bulkload 控制文件参数。
参数 | 值 | 说明 |
---|---|---|
OUTPUT | /soft/isbn.data |
指定导出 BINARY 数据的位置。这里为服务器上文件路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.4 OUTPUT TABLE。 |
INFILE | /soft/isbn.csv |
指定要导入的CSV 数据文件,这里使用了绝对路径,请参考 PostgreSQL pg_bulkload 控制文件参数#2.2 INPUT INFILE。 |
WRITER | BINARY |
导出 BINARY 数据。请参考 PostgreSQL pg_bulkload 控制文件参数#2.3 WRITER LOADER。 |
OUT_COL | INTEGER(8) |
指定第一列的数据类型,请参考 PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数 。 |
OUT_COL | VARCHAR(13) |
指定第二列的数据类型,请参考 PostgreSQL pg_bulkload 控制文件参数#4 Binary 导出参数 。 |
MULTI_PROCESS | YES |
指定是否开启并发导出,请参考 PostgreSQL pg_bulkload 控制文件参数#2.18 MULTI_PROCESS。 |
3.3 导出二进制数据
- 清理环境。
rm -rf /soft/isbn.data /soft/isbn.data.ctl /soft/isbn.data.log
- 调用 pg_bulkload 将CSV 数据导出为 BANIRAY 格式。
time pg_bulkload -U postgres -d testdb /soft/output_baniry_csv.ctl
- 导出所耗费时间为
3.845s
。
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
12180911 Rows successfully loaded.
0 Rows not loaded due to parse errors.
0 Rows not loaded due to duplicate errors.
0 Rows replaced with new rows.
real 0m4.043s
user 0m0.003s
sys 0m0.004s
4 小结 & FAQ
4.1 isbn.data.ctl 文件解读
这里是使用 pg_bulkload 导出的控制文件,在未来可以在导入 BINARY 格式数据中使用。
其中的参数说明。请参考 pg_bulkload 控制文件参数。
INPUT = /soft/isbn.data
OUTPUT = isbn
LOGFILE = /soft/isbn.data.log
PARSE_BADFILE = /soft/isbn.data.prs
DUPLICATE_BADFILE = /soft/isbn.data.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = YES
VERBOSE = NO
TRUNCATE = NO
WRITER = DIRECT
TYPE = BINARY
COL = BIGINT (8)
COL = VARCHAR (13)
# ENCODING = UTF8